package com.ruoyi.system.service.impl.estate;

import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.system.domain.estate.Repair;
import com.ruoyi.system.domain.estate.Resident;
import com.ruoyi.system.mapper.estate.EstateRepairMapper;
import com.ruoyi.system.mapper.estate.EstateResidentMapper;
import com.ruoyi.system.service.estate.IRepairService;

/**
 * 维修信息服务实现类
 * 
 * @author ruoyi
 */
@Service("oldRepairServiceImpl")
public class RepairServiceImpl implements IRepairService 
{
    @Autowired
    private EstateRepairMapper repairMapper;
    
    @Autowired
    private EstateResidentMapper residentMapper;

    /**
     * 查询维修信息
     * 
     * @param repairId 维修信息主键
     * @return 维修信息
     */
    @Override
    public Repair selectRepairById(Long repairId)
    {
        return repairMapper.selectRepairById(repairId);
    }

    /**
     * 查询维修信息列表
     * 
     * @param repair 维修信息
     * @return 维修信息
     */
    @Override
    public List<Repair> selectRepairList(Repair repair)
    {
        return repairMapper.selectRepairList(repair);
    }
    
    /**
     * 查询用户的维修信息列表
     * 
     * @param userId 用户ID
     * @return 维修信息集合
     */
    @Override
    public List<Repair> selectRepairListByUserId(Long userId)
    {
        // 根据用户ID查询住户信息
        Resident resident = new Resident();
        resident.setUserId(userId);
        List<Resident> residents = residentMapper.selectResidentList(resident);
        
        if (residents.isEmpty())
        {
            return new ArrayList<>(); // 返回空列表而不是null
        }
        
        // 获取住户ID
        Long residentId = residents.get(0).getResidentId();
        
        // 根据住户ID查询维修信息
        return repairMapper.selectRepairListByResidentId(residentId);
    }

    /**
     * 新增维修信息
     * 
     * @param repair 维修信息
     * @return 结果
     */
    @Override
    public int insertRepair(Repair repair)
    {
        repair.setCreateTime(DateUtils.getNowDate());
        return repairMapper.insertRepair(repair);
    }

    /**
     * 修改维修信息
     * 
     * @param repair 维修信息
     * @return 结果
     */
    @Override
    public int updateRepair(Repair repair)
    {
        repair.setUpdateTime(DateUtils.getNowDate());
        return repairMapper.updateRepair(repair);
    }

    /**
     * 批量删除维修信息
     * 
     * @param repairIds 需要删除的维修信息主键
     * @return 结果
     */
    @Override
    public int deleteRepairByIds(Long[] repairIds)
    {
        return repairMapper.deleteRepairByIds(repairIds);
    }

    /**
     * 删除维修信息信息
     * 
     * @param repairId 维修信息主键
     * @return 结果
     */
    @Override
    public int deleteRepairById(Long repairId)
    {
        return repairMapper.deleteRepairById(repairId);
    }
    
    /**
     * 提交报修
     * 
     * @param repair 维修信息
     * @return 结果
     */
    @Override
    public int submitRepair(Repair repair)
    {
        try {
            // 获取当前登录用户ID
            Long userId = SecurityUtils.getUserId();
            
            // 根据用户ID查询住户信息
            Resident resident = new Resident();
            resident.setUserId(userId);
            List<Resident> residents = residentMapper.selectResidentList(resident);
            
            if (!residents.isEmpty()) {
                // 获取住户信息
                Resident userResident = residents.get(0);
                // 设置报修人ID
                repair.setResidentId(userResident.getResidentId());
            }
        } catch (Exception e) {
            // 匿名访问，不设置报修人ID
            System.out.println("匿名提交报修，不设置报修人ID");
        }
        
        // 设置报修编号
        repair.setRepairCode("R" + IdUtils.fastSimpleUUID().substring(0, 8).toUpperCase());
        
        // 设置报修时间
        repair.setRepairTime(DateUtils.getNowDate());
        
        // 设置维修状态为待处理
        repair.setRepairStatus("0");
        
        // 设置状态为正常
        repair.setStatus("0");
        
        // 设置删除标志为存在
        repair.setDelFlag("0");
        
        try {
            // 设置创建者
            repair.setCreateBy(SecurityUtils.getUsername());
        } catch (Exception e) {
            // 匿名访问，设置默认创建者
            repair.setCreateBy("匿名用户");
        }
        
        // 设置创建时间
        repair.setCreateTime(DateUtils.getNowDate());
        
        return repairMapper.insertRepair(repair);
    }
    
    /**
     * 取消报修
     * 
     * @param repairId 维修信息主键
     * @return 结果
     */
    @Override
    public int cancelRepair(Long repairId)
    {
        // 获取维修信息
        Repair repair = repairMapper.selectRepairById(repairId);
        
        if (repair == null)
        {
            return 0;
        }
        
        // 只有待处理状态的报修才能取消
        if (!"0".equals(repair.getRepairStatus()))
        {
            return 0;
        }
        
        // 设置删除标志为已删除
        repair.setDelFlag("1");
        
        // 设置更新者
        repair.setUpdateBy(SecurityUtils.getUsername());
        
        // 设置更新时间
        repair.setUpdateTime(DateUtils.getNowDate());
        
        return repairMapper.updateRepair(repair);
    }
    
    /**
     * 评价报修
     * 
     * @param repair 维修信息
     * @return 结果
     */
    @Override
    public int evaluateRepair(Repair repair)
    {
        // 获取维修信息
        Repair existRepair = repairMapper.selectRepairById(repair.getRepairId());
        
        if (existRepair == null)
        {
            return 0;
        }
        
        // 只有已完成状态的报修才能评价
        if (!"3".equals(existRepair.getRepairStatus()))
        {
            return 0;
        }
        
        // 设置维修状态为已评价
        existRepair.setRepairStatus("4");
        
        // 设置满意度
        existRepair.setSatisfaction(repair.getSatisfaction());
        
        // 设置评价内容
        existRepair.setEvaluation(repair.getEvaluation());
        
        // 设置评价时间
        existRepair.setEvaluationTime(DateUtils.getNowDate());
        
        // 设置更新者
        existRepair.setUpdateBy(SecurityUtils.getUsername());
        
        // 设置更新时间
        existRepair.setUpdateTime(DateUtils.getNowDate());
        
        return repairMapper.updateRepair(existRepair);
    }
} 